﻿using System;
using System.Text;
using JetBrains.Annotations;

namespace K9Nano.Serialize
{
    public interface ISerializer
    {
        byte[] Serialize(string value)=> Encoding.UTF8.GetBytes(value);
        byte[] Serialize(int value) => BitConverter.GetBytes(value);
        byte[] Serialize(long value) => BitConverter.GetBytes(value);
        byte[] Serialize(double value) => BitConverter.GetBytes(value);
        byte[] Serialize(bool value) => BitConverter.GetBytes(value);
        byte[] Serialize(uint value) => BitConverter.GetBytes(value);
        byte[] Serialize(ulong value) => BitConverter.GetBytes(value);
        byte[] Serialize(short value) => BitConverter.GetBytes(value);
        byte[] Serialize(ushort value) => BitConverter.GetBytes(value);
        byte[] Serialize(float value) => BitConverter.GetBytes(value);
        byte[] Serialize(char value) => BitConverter.GetBytes(value);
        byte[] Serialize(object obj);
        string SerializeToString(object obj);

        string DeserializeString([NotNull] byte[] bytes) => Encoding.UTF8.GetString(bytes);
        int DeserializeInt([NotNull] byte[] bytes) => BitConverter.ToInt32(bytes);
        long DeserializeLong([NotNull] byte[] bytes) => BitConverter.ToInt64(bytes);
        double DeserializeDouble([NotNull] byte[] bytes) => BitConverter.ToDouble(bytes);
        bool DeserializeBoolean([NotNull] byte[] bytes) => BitConverter.ToBoolean(bytes);
        uint DeserializeUInt([NotNull] byte[] bytes) => BitConverter.ToUInt32(bytes);
        ulong DeserializeULong([NotNull] byte[] bytes) => BitConverter.ToUInt64(bytes);
        short DeserializeShort([NotNull] byte[] bytes) => BitConverter.ToInt16(bytes);
        float DeserializeFloat([NotNull] byte[] bytes) => BitConverter.ToSingle(bytes);
        char DeserializeChar([NotNull] byte[] bytes) => BitConverter.ToChar(bytes);
        ushort DeserializeUShort([NotNull] byte[] bytes) => BitConverter.ToUInt16(bytes);

        T Deserialize<T>([NotNull]byte[] bytes);
        object Deserialize(string data, Type type);
        T Deserialize<T>(string data) => (T) Deserialize(data, typeof(T));
    }
}